home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-01
/
snip1292.zip
/
WHICHARC.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-26
|
3KB
|
93 lines
/*
--------------------------------------------------------------------
Module: WHICHARC.C
Subject: tries to determine the archiver used to compress files
Author: Heinz Ozwirk
modified for SNIPPETS by Bob Stout
Status: public domain
Started: 28.09.1991 13:35:57
Modified: 13.10.1991 14:15:57
--------------------------------------------------------------------
Prototype: int WhichArc(char *pName)
pName address of full path name of file to examine
Result -1: file not found
UNKNOWN: unknown packer
ARC: ARC or PKARC
ARJ: ARJ
LHA: LHARC or LHA
ZIP: PKZIP
ZOO: Zoo
LHARC/LHA
No archive header. WhichArc examines the checksum of the first
file header. If the checksum is valid and if the string -lh?-
is found, LHA or LHARC is assumed.
ARJ
If a file starts with 0x60, 0xEA, ARJ is assumed.
ZIP
If the file begins with "PK", PKZIP is assumed.
ZOO
Zoo'ed archives always start with "ZOO x.xx Archive". WhichArc
only looks for "ZOO".
ARC
No header. Files starting with 0x1A are assumed to be ARCed.
--------------------------------------------------------------------
*/
#include <stdio.h>
#include <string.h>
typedef unsigned char BYTE;
#define strNcmp(s1,s2,n) !strncmp((const char *)(s1), (s2), (n))
enum {UNKNOWN, ARC, ZOO, ARJ, LHARC, LHA, ZIP}
WhichArc(char *pName)
{
FILE *fp;
BYTE header[128];
int c, i, n;
memset(header, 0, sizeof(header));
fp = fopen(pName, "rb");
if (fp == NULL)
return -1;
n = fread(header, sizeof(BYTE), sizeof(header) - sizeof(BYTE), fp);
fclose(fp);
if (n <= 0)
return -1;
if (n >= 7 && n >= header[0] + 2)
{
for (c = 0, i = header[0]; i--; c += (header+2)[i])
;
if ((c & 0x00FF) == header[1] &&
strNcmp(&header[2], "-lh", 3) &&
'-' == header[6])
{
return (header[5] > '1') ? LHA : LHARC;
}
}
if (n >= 2)
{
if (strNcmp(header, "\x60\xEA", 2))
return ARJ;
if (strNcmp(header, "PK", 2))
return ZIP;
}
if (n >= 3 && strNcmp(header, "ZOO", 3))
return ZOO;
if (n >= 25 && *header == 0x1A) return ARC;
return UNKNOWN;
}